package com.ai.interceptor;


/**
 * 不必在Controller中对异常进行处理，抛出即可，由此异常解析器统一控制。<br>
 * ajax请求（有@ResponseBody的Controller）发生错误，输出JSON。<br>
 * 页面请求（无@ResponseBody的Controller）发生错误，输出错误页面。<br>
 * 需要与AnnotationMethodHandlerAdapter使用同一个messageConverters<br>
 * Controller中需要有专门处理异常的方法。
 * 
 * 
 * */
//public class AnnotationHandlerMethodExceptionResolver extends ExceptionHandlerExceptionResolver {
//    // 默认错误页面
//    private String defaultErrorView;
//
//    private ThreadPoolTaskExecutor taskExecutor;
//
//    @Resource
//    private LogErrorService logErrorService;
//
//    protected ModelAndView doResolveHandlerMethodException(HttpServletRequest request, HttpServletResponse response, HandlerMethod handlerMethod, Exception exception) {
//        if (handlerMethod == null) {
//            return null;
//        }
//        Method method = handlerMethod.getMethod();
//        if (method == null) {
//            return null;
//        }
//        StringBuffer errorMesg = new StringBuffer();
//        ModelAndView returnValue = new ModelAndView();
//        // 处理自定义异常将业务异常信息返回
//        if (exception instanceof BusinessException) {
//            errorMesg.append(exception.getMessage());
//            returnValue.setViewName(defaultErrorView);
//        } else if (exception instanceof BindException) {// 处理spring Hibernate
//            List<FieldError> fes = ((BindException) exception).getFieldErrors();
//            for (FieldError fe : fes) {
//                errorMesg.append(fe.getDefaultMessage());
//                errorMesg.append("<br>");
//            }
//            // 记录系统异常
//            this.insertLogError(handlerMethod, exception, method);
//        } else { // 其他异常跳到500页面
//            returnValue.setViewName("error/500");
//            // 记录系统异常
//            this.insertLogError(handlerMethod, exception, method);
//        }
//
//        // ModelAndView returnValue =
//        // super.doResolveHandlerMethodException(request, response,
//        // handlerMethod, exception);
//        ResponseBody responseBodyAnn = AnnotationUtils.findAnnotation(method, ResponseBody.class);
//        // 如果是ajax请求则返回json对象Result 这里的ajax请求是返回值有@ResponseBody的方法
//        // 所有的ajax请求方法最好使用@ResponseBody标示 否则这里无法识别是否是ajax请求
//        if (responseBodyAnn != null) {
//            try {
//                ResponseStatus responseStatusAnn = AnnotationUtils.findAnnotation(method, ResponseStatus.class);
//                if (responseStatusAnn != null) {
//                    HttpStatus responseStatus = responseStatusAnn.value();
//                    String reason = responseStatusAnn.reason();
//                    if (!StringUtils.hasText(reason)) {
//                        response.setStatus(responseStatus.value());
//                    } else {
//                        try {
//                            response.sendError(responseStatus.value(), reason);
//                        } catch (IOException e) {
//                        }
//                    }
//                }
//                // 创建返回对象Result并解析成json
//                return handleResponseBody(returnValue, request, response, errorMesg.toString());
//            } catch (Exception e) {
//                return null;
//            }
//        }
//        returnValue.addObject("error", errorMesg.toString());
//        return returnValue;
//    }
//
//    /**
//     * Description ： 捕获异常记录数据库<br>
//     * 
//     * yangwb
//     * 
//     * @param handlerMethod
//     * @param exception
//     * @param method
//     * @since
//     *
//     */
//    private void insertLogError(HandlerMethod handlerMethod, Exception exception, Method method) {
//        // for (int i = 0; i < 1000; i++) {
//        // 记录logerror 错误信息
//        String expMessage = null;
//        try {
//            ByteArrayOutputStream buf = new ByteArrayOutputStream();
//            exception.printStackTrace(new PrintWriter(buf, true));
//            expMessage = buf.toString();
//            buf.close();
//            LogError logError = new LogError();
//            // 区域
//            logError.setOperatorAreaId(SystemConstant.SYS_ID);
//            logError.setCreateBy(1);
//            logError.setErrorDate(new Date());
//            //
//            logError.setErrorMessage(expMessage);
//            StringBuffer sb = new StringBuffer();
//            sb.append(handlerMethod.getBeanType().getName()).append(".").append(method.getName());
//            // 方法名
//            logError.setMethodName(sb.toString());
//            // 保存至 log_error 链表中
//            // LogQueue.offerLogError(logError);
//            // }
//            taskExecutor.execute(new LogThread(logErrorService, logError));
//
//        } catch (IOException e1) {
//
//        }
//
//    }
//
//    // 创建返回对象Result并解析成json
//    @SuppressWarnings({ "unchecked", "rawtypes", "resource" })
//    private ModelAndView handleResponseBody(ModelAndView returnValue, HttpServletRequest request, HttpServletResponse response, String errorMesg) throws ServletException, IOException {
//        // Map value = returnValue.getModelMap();
//        Result value = new Result(false, Result.INPUT_AUTO, errorMesg);
//        HttpInputMessage inputMessage = new ServletServerHttpRequest(request);
//        List<MediaType> acceptedMediaTypes = inputMessage.getHeaders().getAccept();
//        if (acceptedMediaTypes.isEmpty()) {
//            acceptedMediaTypes = Collections.singletonList(MediaType.ALL);
//        }
//        MediaType.sortByQualityValue(acceptedMediaTypes);
//        HttpOutputMessage outputMessage = new ServletServerHttpResponse(response);
//        Class<?> returnValueType = value.getClass();
//        List<HttpMessageConverter<?>> messageConverters = super.getMessageConverters();
//        if (messageConverters != null) {
//            for (MediaType acceptedMediaType : acceptedMediaTypes) {
//                for (HttpMessageConverter messageConverter : messageConverters) {
//                    if (messageConverter.canWrite(returnValueType, acceptedMediaType)) {
//                        messageConverter.write(value, acceptedMediaType, outputMessage);
//                        return new ModelAndView();
//                    }
//                }
//            }
//        }
//        if (logger.isWarnEnabled()) {
//            logger.warn("Could not find HttpMessageConverter that supports return type [" + returnValueType + "] and " + acceptedMediaTypes);
//        }
//        return null;
//    }
//
//    public String getDefaultErrorView() {
//        return defaultErrorView;
//    }
//
//    public void setDefaultErrorView(String defaultErrorView) {
//        this.defaultErrorView = defaultErrorView;
//    }
//
//    public void setTaskExecutor(ThreadPoolTaskExecutor taskExecutor) {
//        this.taskExecutor = taskExecutor;
//    }
//
// }
